};
Signals.addSignalMethods(Notification.prototype);
-function Source(id, title, createIcon) {
- this._init(id, title, createIcon);
+function Source(title, createIcon) {
+ this._init(title, createIcon);
}
Source.prototype = {
- _init: function(id, title, createIcon) {
- this.id = id;
+ _init: function(title, createIcon) {
this.title = title;
if (createIcon)
this.createIcon = createIcon;
this._updateState();
}));
- this._summaryItems = {};
+ this._summaryItems = [];
this._longestSummaryItem = null;
},
},
contains: function(source) {
- return this._summaryItems.hasOwnProperty(source.id);
+ return this._getIndexOfSummaryItemForSource(source) >= 0;
+ },
+
+ _getIndexOfSummaryItemForSource: function(source) {
+ for (let i = 0; i < this._summaryItems.length; i++) {
+ if (this._summaryItems[i].source == source)
+ return i;
+ }
+ return -1;
},
add: function(source) {
if (this.contains(source)) {
- log('Trying to re-add source ' + source.id);
+ log('Trying to re-add source ' + source.title);
return;
}
let newItemTitleWidth = summaryItem.getTitleNaturalWidth();
if (newItemTitleWidth > minTitleWidth) {
- for (sourceId in this._summaryItems) {
- this._summaryItems[sourceId].setMinTitleWidth(newItemTitleWidth);
+ for (let i = 0; i < this._summaryItems.length; i++) {
+ this._summaryItems[i].setMinTitleWidth(newItemTitleWidth);
}
summaryItem.setMinTitleWidth(newItemTitleWidth);
this._longestSummaryItem = summaryItem;
}
- this._summaryItems[source.id] = summaryItem;
+ this._summaryItems.push(summaryItem);
source.connect('notify', Lang.bind(this, this._onNotify));
},
removeSource: function(source) {
- if (!this.contains(source))
+ let index = this._getIndexOfSummaryItemForSource(source);
+ if (index == -1)
return;
// remove all notifications with this source from the queue
}
this._notificationQueue = newNotificationQueue;
- this._summary.remove_actor(this._summaryItems[source.id].actor);
+ this._summary.remove_actor(this._summaryItems[index].actor);
if (this._summary.get_children().length > 0)
this._summaryNeedsToBeShown = true;
else
this._summaryNeedsToBeShown = false;
- delete this._summaryItems[source.id];
+ this._summaryItems.splice(index, 1);
if (this._longestSummaryItem.source == source) {
let maxTitleWidth = 0;
this._longestSummaryItem = null;
- for (sourceId in this._summaryItems) {
- let summaryItem = this._summaryItems[sourceId];
+ for (let i = 0; i < this._summaryItems.length; i++) {
+ let summaryItem = this._summaryItems[i];
if (summaryItem.getTitleNaturalWidth() > maxTitleWidth) {
maxTitleWidth = summaryItem.getTitleNaturalWidth();
this._longestSummaryItem = summaryItem;
}
}
- for (sourceId in this._summaryItems) {
- this._summaryItems[sourceId].setMinTitleWidth(maxTitleWidth);
+ for (let i = 0; i < this._summaryItems.length; i++) {
+ this._summaryItems[i].setMinTitleWidth(maxTitleWidth);
}
}
this._updateState();
},
- removeSourceByApp: function(app) {
- for (let sourceId in this._summaryItems)
- if (this._summaryItems[sourceId].source.app == app)
- this.removeSource(this._summaryItems[sourceId].source);
- },
-
removeNotification: function(notification) {
if (this._notification == notification && (this._notificationState == State.SHOWN || this._notificationState == State.SHOWING)) {
if (this._notificationTimeoutId) {
this._notificationQueue.splice(index, 1);
},
- getSource: function(id) {
- if (this._summaryItems[id])
- return this._summaryItems[id].source;
- return null;
- },
-
_getNotification: function(id, source) {
if (this._notification && this._notification.id == id)
return this._notification;
Lang.bind(this, this._acquiredName),
Lang.bind(this, this._lostName));
+ this._sources = {};
this._currentNotifications = {};
Shell.WindowTracker.get_default().connect('notify::focus-app',
}
},
- _sourceId: function(id) {
- return 'source-' + id;
- },
-
Notify: function(appName, replacesId, icon, summary, body,
actions, hints, timeout) {
- let source = Main.messageTray.getSource(this._sourceId(appName));
+ let source = this._sources[appName];
let id = null;
// Filter out notifications from Empathy, since we
// been acknowledged.
if (source == null) {
let title = appNameMap[appName] || appName;
- source = new Source(this._sourceId(appName), title, icon, hints);
+ source = new Source(title, icon, hints);
Main.messageTray.add(source);
+ this._sources[appName] = source;
source.connect('clicked', Lang.bind(this,
function() {
source.destroy();
}));
+ source.connect('destroy', Lang.bind(this,
+ function() {
+ delete this._sources[appName];
+ }));
let sender = DBus.getCurrentMessageContext().sender;
let busProxy = new Bus();
_onFocusAppChanged: function() {
let tracker = Shell.WindowTracker.get_default();
- if (tracker.focus_app)
- Main.messageTray.removeSourceByApp(tracker.focus_app);
+ if (!tracker.focus_app)
+ return;
+
+ for (let id in this._sources) {
+ let source = this._sources[id];
+ if (source.app == tracker.focus_app) {
+ source.destroy();
+ return;
+ }
+ }
},
_actionInvoked: function(notification, action, source, id) {
DBus.conformExport(NotificationDaemon.prototype, NotificationDaemonIface);
-function Source(sourceId, title, icon, hints) {
- this._init(sourceId, title, icon, hints);
+function Source(title, icon, hints) {
+ this._init(title, icon, hints);
}
Source.prototype = {
__proto__: MessageTray.Source.prototype,
- _init: function(sourceId, title, icon, hints) {
- MessageTray.Source.prototype._init.call(this, sourceId, title);
+ _init: function(title, icon, hints) {
+ MessageTray.Source.prototype._init.call(this, title);
this.app = null;
this._openAppRequested = false;
__proto__: MessageTray.Source.prototype,
_init: function(accountPath, connPath, channelPath, targetHandle, targetHandleType, targetId) {
- MessageTray.Source.prototype._init.call(this, targetId, targetId);
+ MessageTray.Source.prototype._init.call(this, targetId);
this._accountPath = accountPath;
WindowAttentionHandler.prototype = {
_init : function() {
+ this._startupIds = {};
+ this._sources = {};
+
let display = global.screen.get_display();
display.connect('window-demands-attention', Lang.bind(this, this._onWindowDemandsAttention));
let tracker = Shell.WindowTracker.get_default();
- this._startupIds = {};
tracker.connect('startup-sequence-changed', Lang.bind(this, this._onStartupSequenceChanged));
},
}
},
- _sourceId : function(appId) {
- return 'attention-' + appId;
- },
-
_getTitle : function(app, window) {
if (this._startupIds[window.get_startup_id()])
return app.get_name();
let tracker = Shell.WindowTracker.get_default();
let app = tracker.get_window_app(window);
+ let appId = app.get_id();
- let source = Main.messageTray.getSource(this._sourceId(app.get_id()));
+ let source = this._sources[appId];
if (source == null) {
- source = new Source(this._sourceId(app.get_id()), app, window);
+ source = new Source(app, window);
+ this._sources[appId] = source;
Main.messageTray.add(source);
source.connect('clicked', Lang.bind(this, function() { source.destroy(); }));
+ source.connect('destroy', Lang.bind(this, function() { delete this._sources[appId]; }));
}
let notification = new MessageTray.Notification(window.get_startup_id(), source, this._getTitle(app, window), this._getBanner(app, window), true);
}
};
-function Source(sourceId, app, window) {
- this._init(sourceId, app, window);
+function Source(app, window) {
+ this._init(app, window);
}
Source.prototype = {
__proto__ : MessageTray.Source.prototype,
- _init: function(sourceId, app, window) {
- MessageTray.Source.prototype._init.call(this, sourceId, app.get_name());
+ _init: function(app, window) {
+ MessageTray.Source.prototype._init.call(this, app.get_name());
this._window = window;
this._app = app;
},